package com.bole.stream;

import java.util.Arrays;
import java.util.Random;
import java.util.stream.Stream;

/**
 * @author: 叶子
 * @date: 2022/04/10 17:27
 * 流的创建，下面以5种方式为例
 * 中间操作：
 * 无状态(不需要依赖于其他元素)的有：filter map flatMap peek
 * 有状态(依赖于其他元素)的有：distinct sort limit
 * 终止操作(只能有1个)：
 * 非短路操作(需要遍历完流中的每一个元素)：forEach collect reduce min/max count
 * 短路操作(不需要遍历完流中的每一个元素)：findFirst anyMatch/allMatch/noneMatch
 **/
public class StreamOperateDemo {
    public static void main(String[] args) {
        String[] arr = {"i", "love", "love", "beautiful_and", "", "young", "girl"};
        //1.数组
//        Arrays.stream(arr).forEach(System.out::println);
        //2.list
//        Arrays.asList(arr).stream().forEach(System.out::println);
        //3.stream.of
//        Stream.of(arr).forEach(System.out::println);
        //4.迭代器  打印1-10元素(第一个元素是初始值，第二个是UnaryOperator<T> f)
//        Stream.iterate(1,i->i+1).limit(10).forEach(System.out::println);
        //5.generate 打印随机数(10以内的)5个 generate()的参数是Supplier<T> S
//        Stream.generate(()->new Random().nextInt(10)).limit(5).forEach(System.out::println);
        /**
         * JDK8流编程完整案例 把数组中的"beautiful_and" 去掉_,转成字符数组，排序，去重
         * 元素的中间操作与终止操作
         * 结果:依次输出 abde...
         * beautiful_and ->beautifuland->字符转成一个新的流(b e a u t i f u l a n d）->sorted->distinct
         */
        Stream.of(arr).filter(i -> !i.isEmpty())//过滤掉空字符串
//                .peek(i->System.out.print(i));//流编程中，必须有一个终止操作，peek是中间操作
                .distinct()//这里演示去重
                .sorted()//这里演示的排序，是对数组的排序
                .limit(1)
                .map(i -> i.replace("_", ""))//map,函数式接口，输入一个参数，输出一个参数
                .flatMap(i -> Stream.of(i.split("")))//用flatMap(也是函数式接口)组装成一个流
                .sorted()//这里的排序是对组成的新的流中字符的排序
                .distinct()//这里的去重，是去掉新的流中的重复的字符
//                .findFirst()//流编程中，终止操作只有能有1个，中间操作可以有0-n个
                .forEach(System.out::print);
    }
}